"""
Excel文件读写模块
功能：处理人员数据的读取和排班结果的导出
"""
from openpyxl import Workbook, load_workbook
from openpyxl.utils import get_column_letter
from scheduler import Person


def load_people_from_excel(filename):
    """
    从Excel加载人员数据
    参数：
        filename: Excel文件路径
    返回：
        Person对象列表
    """
    wb = load_workbook(filename)  # 打开Excel文件
    ws = wb.active  # 获取第一个工作表
    people = []



    # 从第二行开始遍历（假设第一行是标题）
    for row in ws.iter_rows(min_row=2, values_only=True):
        # 创建Person对象（row[0]=工号, row[1]=姓名）
        person = Person(row[0], row[1])

        # 处理不可用周数据（row[2]）
        if row[2]:
            # 替换中文逗号，分割字符串并转换为整数
            weeks_str = str(row[2]).replace('，', ',').strip()
            person.unavailable_weeks = [
                int(w) for w in weeks_str.split(',')
                if w.strip()  # 过滤空字符串
            ]
        people.append(person)

    return people


def save_schedule_to_excel(schedule, filename):
    """
    将排班结果保存到Excel
    参数：
        schedule: 排班数据（字典列表）
        filename: 保存路径
    """
    wb = Workbook()  # 创建新工作簿

    # === 排班表工作表 ===
    ws_schedule = wb.active
    ws_schedule.title = "排班表"

    # 写入表头
    headers = ["日期", "星期", "值班人"]
    ws_schedule.append(headers)

    # 写入每一天的排班数据
    for day in schedule:
        ws_schedule.append([
            day["date"].strftime("%Y-%m-%d"),  # 格式化日期
            day["weekday"],  # 星期几（数字）
            day["person"]  # 值班人姓名
        ])

    # 自动调整列宽
    for col in ws_schedule.columns:
        column = col[0].column_letter  # 获取列字母（如'A'）
        max_length = max(
            len(str(cell.value)) for cell in col
        )
        ws_schedule.column_dimensions[column].width = max_length + 2

    # === 统计表工作表 ===
    ws_stats = wb.create_sheet("统计表")

    # 构建人员值班统计字典
    stats = {}
    for day in schedule:
        name = day["person"]
        if name not in stats:
            stats[name] = 0
        stats[name] += 1

    # 写入统计表头
    ws_stats.append(["姓名", "总值班次数"])

    # 写入每个人的统计
    for name, count in stats.items():
        ws_stats.append([name, count])

    # 保存文件
    wb.save(filename)